home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swags_z.zip / SCREEN.SWG / 0070_Fast Screen Write.pas < prev    next >
Pascal/Delphi Source File  |  1994-08-25  |  2KB  |  78 lines

  1. {
  2. Ok, without even going back to my compiler I can improve yer design.  i
  3. forgot that on 386 and up that a mov [addr],al is faster than a single
  4. stosb etc, so that was likely my largest time deficit.  Yours is the
  5. Imul.  I'll add the color into mine, but I thought that passing up one
  6. less param MIGHT increase the speed slightly.
  7. }
  8. procedure Putstr(x,y:integer;s:string;attr:byte);assembler;
  9. asm
  10.   push ds {that's all you really need}
  11.  
  12.   mov bx,y
  13.   shl bx,1
  14.   mov ax,bx
  15.   shl bx,2
  16.   add ax,bx
  17.   add ax,$b800
  18.   mov es,ax     { es:=$B800 + (Yx$80 + Yx$20) shr 4 or $B800+Y*$A }
  19.   mov di,x
  20.   shl di,1      { di:=x shl 1 }
  21.  
  22.   lds si,s
  23.   mov cl,byte ptr [si]
  24.   inc si
  25.   mov ah,attr
  26. @1:
  27.   mov al,byte ptr [si]
  28.   mov word ptr es:[di],ax
  29.   inc si
  30.   add di,2
  31.   dec cl
  32.   jnz @1
  33.  
  34.   pop ds
  35. end;
  36. (*
  37.   |    Mov AX,Col                  { Load Column to write to.              }
  38.   |    Shl AX,1                    { Column = Column * 2.                  }
  39.   |    Mov BX,AX                   { Copy AX to BX.                        }
  40.   |    Mov AX,Row                  { Load Row to write to.                 }
  41.   |    Mov CX,160                  { Row = Row * 160.                      }
  42.   |    IMul CX
  43.   |    Add AX,BX                   { Offset = (Col * 2) + (Row * 160).     }
  44.   |    Mov DI,AX
  45.  
  46.  
  47. ugh, comments.  You freaking PD coder, you.  You probably like windows
  48. too huh?  This is the only section that I have improved on yer design.
  49. I only discovered the optimize cause I was writing a faster putpixel.
  50.  
  51.  
  52. Questions/comments:
  53.  
  54.     Xor CH,CH
  55.  
  56. You don't need this line at all.  that's 2 opcode tiks for me.
  57. (ahhhh, obsessed)
  58.  
  59.  
  60. Is "mov cl, byte ptr ds:[si]" any slower than "mov cl,[si]" ?
  61.  
  62. I know that "add di,2" is faster than "inc di;inc di" and
  63. "dec cl" is better than "dec cx" and
  64. "xor cx,cx" is faster than "mov cx,0"
  65.  
  66. GE|BEGIN
  67.   |  Start := ReadTimer;
  68.   |   FOR X := -MaxInt TO MaxInt DO
  69.   |    FastWr(40,5,2,'Greg Estabrooks!');
  70.                        ^^^^^^^^^^^^^^,
  71. see that's the problem right there.  It should read: 'Jamie - coder god'
  72.  
  73. The only differences between our code:
  74.   I used lodsb/stosw out of lasyness.
  75.   You used xor ch,ch
  76.   You used imul where I did shifts ( faster, but not the slowest part of
  77.                                      the code, so not a big deal )
  78. *)